實作Tag的java都可以成為jsp用的tag。不過每一次都需要自己實作Tag很麻煩,因此TagSupport是一個已經實作Tag的java class,讓我們更容易實作tag。
同時我們介紹如何自定義Attribute。
(和我部落格同時發佈:http://www.dotblogs.com.tw/alantsai/archive/2013/10/18/tag-attribute_tagsupport.aspx)
TagSupport
TagSupport幫我們直接實作了tag,如果我們要做一個簡單的自定義tag,我們可以使用TagSupport作為我們的base java class。
因此我們只需要override我們想要控制的部份即可。
自定義Tag包括Attribute
像在core jstl裡面的if有test attribute一樣,我們也可以自定義Attribute。
一個Attribute其實就是一個variable,因此我們的Tag class需要包括一個和attribute一樣名稱的variable,此variable要有對應的getter和setter。
範例:
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int doEndTag()
{
try {
this.pageContext.getOut().println("name is : " + name);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return EVAL_PAGE;
}
這邊我們定義了一個參數叫做name,然後在doEndTag()把它輸出來。
有了這個參數以後,我們需要在tld告知我們這個tag多了一個name Attribute,而做法就是在<tag>裡面增加一個<attribute>。
範例:
...
<tag>
<name>test</name>
<tag-class>tag.TestTagSupport</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
...
最後呼叫就很簡單了:
<hello2:test name="AT" />
相信注意到了attribute有三個設定,前兩個應該都滿好理解,不過什麼是rtexprvalue?其實就是說是否接受用Scriptlet或者el方式assign值給這個 attribute。
動態attribute
剛剛定義tag Attribute的方式是先定義好了名稱,不過如果今天我要允許動態attribute,應該如何做呢?
我們只需要實作DynamicAttributes這個interface,然後在tld設定允許dynamic-attributes就可以了。
實作DynamicAttributes需要實作setDynamicAttributes來把動態attribute存起來,之後使用。下面是一個直接輸出的簡單範例:
...
public class TestTagSupport extends TagSupport implements DynamicAttributes {
private Map dynamicAttribute = new HashMap();
...
@Override
public void setDynamicAttribute(String uri, String key, Object value)
throws JspException {
dynamicAttribute.put(key, value.toString());
}
...
上面定義了一個map來儲存我們的動態的attribute。而在doEndTag()則把dynamicAttributefor一圈把內容輸出來而已。
現在要在我們tld定義<tag>的地方增加<dynamic-attributes>是true就okay了:
<tag>
<name>test</name>
<tag-class>tag.TestTagSupport</tag-class>
<body-content>JSP</body-content>
<dynamic-attributes>true</dynamic-attributes>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
最後我們使用起來:
<hello2:test name="AT" a="123" b="456" />
a和b是動態attribute。
結語
這一篇介紹了tag裡面的attribute,並且介紹如何使用動態attribute。
透過attribute我們可以設定不同參數來達到修改程式邏輯。